package muhnes.sizoo.consulta;

import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;
import org.apache.commons.lang3.StringUtils;

public class Campo implements Serializable, IConsultable {
    
    private String id;
    private String valor;
    private String nombre;
    private String descripcion;
    private TipoDato tipoDato;
    private boolean multivalorado;
    private Map<String,String> opciones;
    private Fuente fuente;

    public Campo() {
        opciones = new HashMap<String,String>();
    }

    public Campo(String id, String valor, String nombre, String descripcion, TipoDato tipoDato, Fuente fuente) {
        this.id = id;
        this.valor = valor;
        this.nombre = nombre;
        this.descripcion = descripcion;
        this.tipoDato = tipoDato;
        this.fuente = fuente;
        this.opciones = new HashMap<String,String>();
    }

    public Campo(String id, String valor, String nombre, String descripcion, TipoDato tipoDato, boolean multivalorado, Map<String, String> opciones, Fuente fuente) {
        this.id = id;
        this.valor = valor;
        this.nombre = nombre;
        this.descripcion = descripcion;
        this.tipoDato = tipoDato;
        this.multivalorado = multivalorado;
        this.opciones = opciones;
        this.fuente = fuente;
    }

    public String getId() {
        return id;
    }

    public String getNombre() {
        return nombre;
    }
    
    public String getDescripcion() {
        return descripcion;
    }

    public TipoDato getTipoDato() {
        return tipoDato;
    }

    public String getValor() {
        return valor;
    }
    
    public boolean isSeleccionable() {
        return opciones != null && !opciones.isEmpty();
    }
    
    public boolean isMultivalorado() {
        return multivalorado;
    }
    
    public Map<String, String> getOpciones() {
        return opciones;
    }

    public Fuente getFuente() {
        return fuente;
    }

    @Override
    public boolean equals(Object obj) {
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        final Campo other = (Campo) obj;
        if ((this.id == null) ? (other.id != null) : !this.id.equals(other.id)) {
            return false;
        }
        return true;
    }

    @Override
    public int hashCode() {
        int hash = 3;
        hash = 41 * hash + (this.id != null ? this.id.hashCode() : 0);
        return hash;
    }

    @Override
    public String toString() {
        return "Campo{" + "id=" + id + ", valor=" + valor + ", nombre=" + nombre + ", descripcion=" + descripcion +", tipoDato=" + tipoDato + ", multivalorado=" + multivalorado + ", opciones=" + opciones + ", fuente" + fuente + '}';
    }

    @Override
    public String getValorConsultable() {
        return fuente.getValorConsultable() + "." + valor + " AS \"" + nombre + "\"";
    }
    
    public String formatearValor( String valor ) {
        String retorno = "";
        String[] valores = valor.split(",");
        for( String val : valores ) {
            if( tipoDato == TipoDato.CADENA || 
                tipoDato == tipoDato.FECHA || 
                tipoDato == TipoDato.CARACTER ) {
                if( tipoDato == TipoDato.CADENA && !this.isSeleccionable() ) {
                    retorno += "'%" + val + "%',";
                }
                else {
                    retorno += "'" + val + "',";
                }
            }
            else {
                retorno += val + ",";
            }
        }
        retorno = StringUtils.strip(retorno,",");
        return retorno;
    }
    
}
